﻿//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
//using System.Windows.Controls;
//using IronPython.Runtime;
//using System.Windows;

//namespace WebPythonHost
//{
//  class ViewParser
//  {
//    public static void Parse(PythonDictionary view, Panel parentContainer)
//    {
//      var declarations = ElementDeclarationFactory.AllDeclarations;
//      var declIndex = declarations.ToDictionary(_decl => _decl.Kind);

//      var parserContext = new ViewParserContext
//      {
//        DeclarationsIndex = declIndex,
//        NameScope = new Dictionary<string, object>(),
//        NameScope_Elements = new Dictionary<string, PythonDictionary>(),
//        RootElement = parentContainer,
//      };

//      ParseElement(parserContext, parentContainer, declIndex.FindObject("ViewHost"), view);
//    }

//    // element:
//    //   kind: list
//    //   attributes:
//    //     attr1: val1
//    //     attr2: val2
//    //   links:
//    //   - kind: link_kind1
//    //     attributes:
//    //       link_attr1: link_val1
//    //     elements:
//    //     - element1
//    //     - element2
//    //   - kind: link_kind2
//    //     attributes:
//    //       link_attr1: link_val1
//    //     elements:
//    //     - element1
//    //     - element2
//    static void ParseElement(ViewParserContext context, object parent, ElementDeclaration parentDecl,
//      PythonDictionary element)
//    {
//      if (parentDecl == null)
//        return;

//      foreach (var linkElement in element["links"].As<List>().OrEmpty().OfType<PythonDictionary>())
//      {
//        var linkKind = linkElement["kind"];
//        var linkDecl = parentDecl.Links.FirstOrDefault(_decl => _decl.Kind == linkKind);

//        foreach (var childElement in linkElement["elements"].As<List>().OrEmpty())
//        {
//          var childDecl = GetElementDeclaration(context, childElement);

//          var child = GetElement(context, chilXElement, childDecl);
//          if (child == null)
//            continue;

//          var attributes = childElement["attr
//          var refName = childElement.Attribute_Get("refName");
//          if (refName != null)
//          {
//            loaderContext.NameScope[refName] = child;
//            loaderContext.NameScope_XElements[refName] = childXElement;
//          }

//          AddChildElement(context, parent, linkElement, linkDecl, child);

//          ProcessElement(context, child, childDecl, childXElement);
//        }
//      }
//    }

//    static ObjectDeclaration GetElementDeclaration(FormLoaderContext context, XElement element)
//    {
//      var declName = element.Name.LocalName;
//      if (element.Name == "Ref")
//      {
//        var refName = element.Attribute_Get("Name");
//        declName = loaderContext.NameScope_XElements.FindObject(refName)
//          ._n(_element => _element.Name.LocalName);
//        if (declName == null)
//          return null;
//      }
//      return loaderContext.DeclarationsIndex.FindObject(declName);
//    }

//    static object GetElement(FormLoaderContext parserContext, XElement element, ObjectDeclaration decl)
//    {
//      if (decl != null && decl.Create != null)
//      {
//        return decl.Create(loaderContext, element);
//      }

//      if (element.Name == "Ref")
//      {
//        var refName = element.Attribute_Get("Name");
//        return loaderContext.NameScope.FindObject(refName);
//      }

//      return element;
//    }

//    static void AddChildElement(FormLoaderContext loaderContext, object parent, XElement linkElement,
//      LinkDeclaration linkDecl, object child)
//    {
//      if (linkDecl != null && linkDecl.Add != null)
//      {
//        linkDecl.Add(new LinkAdd_Parameters
//        {
//          Parent = parent,
//          Child = child,
//          LoaderContext = loaderContext,
//          LinkElement = linkElement,
//        });
//        return;
//      }
//    }
//  }

//  class ViewParserContext
//  {
//    public Dictionary<string, ElementDeclaration> DeclarationsIndex;
//    public Dictionary<string, object> NameScope;
//    public Dictionary<string, PythonDictionary> NameScope_Elements;

//    public object RootElement { get; set; }
//  }

//  class ElementDeclaration
//  {
//    public string Kind;
//    public Func<ViewParserContext, PythonDictionary, object> Create;
//    public LinkDeclaration[] Links;
//  }
//  class LinkDeclaration
//  {
//    public string Kind;
//    public Action<LinkAdd_Parameters> Add;
//  }
//  class LinkAdd_Parameters
//  {
//    public object Parent;
//    public object Child;
//    public ViewParserContext ParserContext;
//    public PythonDictionary LinkElement;
//  }

//  static class ElementDeclarationFactory
//  {
//    public static ElementDeclaration[] AllDeclarations = new[]
//    {
//      list,
//    };

//    public static readonly ElementDeclaration list = new ElementDeclaration()
//    {
//      Kind = "list",
//      Links = new[]
//      {
//        new LinkDeclaration()
//        {
//          Name = "properties",
//          Add = p => p.Parent.As<Panel>()._n(_=>_.Children.Add((UIElement)p.Child))
//        },
//      },
//    };
//  }
//}
